﻿using Newtonsoft.Json;
using System;
using System.Diagnostics;
using System.IO;
using System.Threading.Tasks;

namespace QSVToAVIConvertet
{
    class Program
    {
        static async Task Main(string[] args)
        {
            string jsonFilePath = Path.Combine(Environment.CurrentDirectory, "appsettings.json");
            string jsonContent = File.ReadAllText(jsonFilePath);

            // 解析JSON
            dynamic config = JsonConvert.DeserializeObject(jsonContent);

            // 获取FFmpeg路径配置项
            string ffmpegPath = config.FFmpeg.Path; // FFmpeg可执行文件的路径  
            string qsvPath = config.Qsv.Path; // FFmpeg可执行文件的路径  


            string startDirectory = string.IsNullOrEmpty(qsvPath) ? Environment.CurrentDirectory : qsvPath; // 程序启动目录  
            string outputDirectory = Path.Combine(startDirectory, "MP4"); // 输出目录  

            // 确保输出目录存在  
            if (!Directory.Exists(outputDirectory))
            {
                Directory.CreateDirectory(outputDirectory);
            }
            //string inputFilePath = "F:\\feng\\soft\\ffmpeg\\input.qsv"; // 替换为你的QSV文件路径  
            //string outputFilePath = "F:\\feng\\soft\\ffmpeg\\output_file.mp4"; // 输出的MP4文件路径  
            string[] qsvFiles = Directory.GetFiles(startDirectory, "*.qsv");
            foreach (string qsvFile in qsvFiles)
            {
                string mp4FileName = Path.GetFileNameWithoutExtension(qsvFile) + ".mp4";
                string mp4FilePath = Path.Combine(outputDirectory, mp4FileName);

                // 使用FFmpeg进行转换
                await ConvertQsvToMp4Async(qsvFile, ffmpegPath, mp4FilePath);
            }

        //    // 构建FFmpeg命令行参数  
        //    // string ffargs = $"-i \"{inputFilePath}\" -c:v copy -c:a copy \"{outputFilePath}\"";

        //    // 启动FFmpeg进程  
        //    ProcessStartInfo startInfo = new ProcessStartInfo
        //{
        //    FileName = ffmpegPath,
        //    Arguments = ffargs,
        //    UseShellExecute = false,
        //    RedirectStandardOutput = true,
        //    RedirectStandardError = true,
        //    CreateNoWindow = true
        //};

        //    using (Process process = new Process { StartInfo = startInfo })
        //    {
        //        process.Start();

        //        // 读取FFmpeg的输出信息（可选）  
        //        string output = process.StandardOutput.ReadToEnd();
        //        string error = process.StandardError.ReadToEnd();

        //        process.WaitForExit(); // 等待转换完成  

        //        if (process.ExitCode != 0) // 如果FFmpeg返回非零退出码，表示出错  
        //        {
        //            Console.WriteLine("转换失败: " + error);
        //        }
        //        else
        //        {
        //            Console.WriteLine("转换成功!");
        //        }
        //    }
            Console.ReadLine();
        }


        static async Task ConvertQsvToMp4Async(string inputFilePath,string ffmpegPath, string outputFilePath)
        {
            // 检查FFmpeg是否可用            
            if (!File.Exists(ffmpegPath))
            {
                Console.WriteLine("Error: FFmpeg not found.");
                return;
            }

            // 使用FFmpeg进行转换
            Process ffmpegProcess = new Process();
            ffmpegProcess.StartInfo.FileName = ffmpegPath;
            ffmpegProcess.StartInfo.Arguments = $"-i \"{inputFilePath}\" -c:v copy  -c:a copy \"{outputFilePath}\"";
            ffmpegProcess.StartInfo.UseShellExecute = false;
            ffmpegProcess.StartInfo.RedirectStandardOutput = true;
            ffmpegProcess.StartInfo.RedirectStandardError = true;

            // 异步读取标准输出和标准错误流
            ffmpegProcess.OutputDataReceived += (sender, e) => Console.WriteLine(e.Data);
            ffmpegProcess.ErrorDataReceived += (sender, e) => Console.WriteLine(e.Data);
            ffmpegProcess.Start();
            ffmpegProcess.BeginOutputReadLine();
            ffmpegProcess.BeginErrorReadLine();

            // 等待进程退出
            await Task.Run(() => ffmpegProcess.WaitForExit());

            // 输出转换结果
            Console.WriteLine($"Converted: {inputFilePath} -> {outputFilePath}");
        }
    }
}
